//
//@File    :	14.1_studentc.h
//@Time    :	2022/01/19 15:55:33
//@Auther  :	Sun Sheng
//@Contact :	970340843@qq.com
//@Desc    :	defining a Studengt class using containment
//

#ifndef STUDENTC_H_
#define STUDENTC_H_

#include <iostream>
#include <string>
#include <valarray>//用于处理数值


// valarray的一些方法
// operator[]():访问各个元素
// size():返回包含的元素
// sum():返回元素总和
// max():返回最大的元素
// min():返回最小的元素
class Student
{
private:
    //方便使用和表示类型,私有的只能在类中使用
    typedef std::valarray<double> ArrayDb;
    //优先使用包含关系,而不是私有继承关系
    //1.新类需要访问保护成员时使用私有继承
    //2.需要重新定义虚函数时,使用私有继承
    std::string name;
    ArrayDb scores;

    std::ostream & arr_out(std::ostream & os)const;
public:
    //初始化的顺序时被声明的顺序,而不是在初始列表中的顺序
    Student():name("Null Student"),scores(){}
    explicit Student(const std::string & s):name(s),scores(){}
    explicit Student(int n):name("Nully"),scores(n){}
    Student(const std::string & s,int n):name(s),scores(n){}
    Student(const std::string &s,const ArrayDb &a):name(s),scores(a){}
    Student(const char * str,const double * pd,int n):name(str),scores(pd,n){}
    ~Student();
    double Average()const;
    const std::string & Name()const;
    double & operator[](int i);
    double operator[](int i)const;
//friends
    //input
    friend std::istream & operator>>(std::istream & is,Student & stu);//1 word
    friend std::istream & getline(std::istream & is,Student & stu);//1 line
    //output
    friend std::ostream & operator<<(std::ostream & os,const Student & stu);
};



#endif	// STUDENTC_H_